package bridge

import "fmt"

// 桥接模式（Bridge Pattern）是一种结构型设计模式，用于将抽象部分与实现部分分离，使它们可以独立变化。
// 这种模式通过组合替代继承，解决多层继承带来的子类爆炸问题，特别适用于多维度变化的场景。

// 模式结构
// 抽象（Abstraction）：定义高层抽象接口，包含对实现部分的引用
// 精确抽象（Refined Abstraction）：扩展抽象接口，提供更具体的控制
// 实现者（Implementor）：定义实现类的接口
// 具体实现（Concrete Implementor）：实现Implementor接口

// 实际业务场景示例：支付系统
// 假设我们需要设计一个支付系统，支持：
// 支付方式维度：微信支付、支付宝支付
// 支付验证维度：指纹验证、人脸验证
// 这两个维度独立变化，使用桥接模式可避免创建 微信指纹支付、微信人脸支付、支付宝指纹支付、支付宝人脸支付 等所有组合的子类。

// PaymentVerifier 支付验证接口
type PaymentVerifier interface {
	Verify() error
}

// FingerprintVerifier 指纹验证器
type FingerprintVerifier struct {
}

// Verify 指纹验证
func (f *FingerprintVerifier) Verify() error {
	fmt.Println("指纹验证中...验证成功")
	return nil
}

// FaceVerifier 人脸验证器
type FaceVerifier struct {
}

// Verify 人脸验证
func (f *FaceVerifier) Verify() error {
	fmt.Println("人脸识别验证中...验证成功")
	return nil
}

// PaymentProcessor 抽象层：支付处理器
type PaymentProcessor struct {
	// 桥接关键：持有实现者引用
	verifier PaymentVerifier
}

// Process 支付处理
func (p *PaymentProcessor) Process(amount float64) error {
	fmt.Printf("支付处理中...金额：%f\n", amount)
	return p.verifier.Verify()
}

// WechatPayment 精确抽象：微信支付
type WechatPayment struct {
	*PaymentProcessor
}

func NewWechatPayment(verifier PaymentVerifier) *WechatPayment {
	return &WechatPayment{
		PaymentProcessor: &PaymentProcessor{
			verifier: verifier,
		},
	}
}

// Process 支付处理
func (w *WechatPayment) Process(amount float64) error {
	fmt.Printf("微信支付处理中...金额：%f\n", amount)
	err := w.PaymentProcessor.Process(amount)
	if err != nil {
		fmt.Printf("微信支付处理失败...金额：%f\n", amount)
		return err
	}
	fmt.Printf("微信支付处理成功...金额：%f\n", amount)
	return nil
}

// AlipayPayment 精确抽象：支付宝支付
type AlipayPayment struct {
	*PaymentProcessor
}

func NewAlipayPayment(verifier PaymentVerifier) *AlipayPayment {
	return &AlipayPayment{
		PaymentProcessor: &PaymentProcessor{
			verifier: verifier,
		},
	}
}

// Process 支付处理
func (a *AlipayPayment) Process(amount float64) error {
	fmt.Printf("支付宝支付处理中...金额：%f\n", amount)
	err := a.PaymentProcessor.Process(amount)
	if err != nil {
		fmt.Printf("支付宝支付处理失败...金额：%f\n", amount)
		return err
	}
	fmt.Printf("支付宝支付处理成功...金额：%f\n", amount)
	return nil
}
